package top.xzxsrq.utils;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public abstract class StringUtilsZX extends top.xzxsrq.common.utils.StringUtilsZX {
    /**
     * 模仿 JavaScript 的 replace 函数。
     *
     * @param str   原始字符串
     * @param reg   正则表达式
     * @param call  回调函数，接受一个列表参数，返回替换后的字符串
     * @return      替换后的字符串
     */
    public static String replace(String str, String reg, Function<List<String>, String> call) {
        // 编译正则表达式
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(str);
        // 创建 StringBuffer 用于存储结果
        StringBuffer result = new StringBuffer();
        // 查找并替换所有匹配项
        while (matcher.find()) {
            // 获取所有捕获组的值
            List<String> groups = new LinkedList<>();
            for (int i = 0; i <= matcher.groupCount(); i++) {
                groups.add(matcher.group(i));
            }
            // 调用回调函数获取替换后的字符串
            String replacement = call.apply(groups);
            // 使用 appendReplacement 方法进行替换
            // 使用 Matcher.quoteReplacement 方法来处理特殊字符
            matcher.appendReplacement(result, Matcher.quoteReplacement(replacement));
        }
        // 完成替换后，调用 appendTail 方法将剩余部分追加到结果中
        matcher.appendTail(result);
        // 返回结果字符串
        return result.toString();
    }

    /**
     * 替换里面${}，如果里面有数字，那么没有数字的就是跟着数字后面，有数字就是使用第二个参数下标去替换
     *
     * @param str
     * @param values
     * @return
     */
    public static String strFormat(String str, String... values) {
        // 替换里面的${这里面可以写数字}
        String pattern = "\\$\\{(.*?)}";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(str);
        AtomicInteger maxNumber = new AtomicInteger(-1);
        while (m.find()) {
            String group = m.group(1);
            if (StringUtilsZX.isNotEmpty(group)) {
                maxNumber.set(Math.max(maxNumber.get(), Integer.parseInt(group)));
            }
        }
        return StringUtilsZX.replace(str, pattern, (group) -> {
            String i = group.get(1);
            if (StringUtilsZX.isNotEmpty(i)) {
                return values[Integer.parseInt(group.get(1))];
            } else {
                maxNumber.getAndIncrement();
                return values[maxNumber.get()];
            }
        });
    }

//    public static void main(String[] args) {
//        String s = strFormat("视频时长相等：${1},${0}",
//                "https://vip1.lz-cdn5.com/20230511/51013_d39c3f1f/index.m3u8",
//                "E:\\windows-amd64-filebrowser\\filebrowserData\\视频\\种地吧0001\\0040.mp4");
//        System.out.println("s = " + s);
//    }
}
